C# possui os comandos when e is que podem ser utilizados em conjunto com o
comando switch para checar o tipo de dado de um valor no case, como mostrado na
sintaxe logo abaixo:
Sintaxe
case tipo_dado nome_varialvel when nome_variavel is valor_comparacao
Onde
-
Exemplo 4
enum Enumerador {
Zero,
Um,
Dois,
Tres
}
Enumerador enm = Enumerador.Zero;
switch(enm)
{
case Enumerador e when e is Enumerador.Zero:
Console.WriteLine(e);
break;
default:
break;
}
Saída
Zero
switch, when e expressões
O comando when permite que expressões relacionais ou lógicas possam ser utilizadas
nos cases do comando switch como pode ser visto nos exemplos abaixo:
Exemplo 5
using System;
public class Program
{
enum Enumerador
{
Zero,
Um,
Dois,
Tres
}
public static void Main()
{
Enumerador enm = Enumerador.Zero;
switch(enm)
{
case Enumerador e when (e == Enumerador.Zero || e == Enumerador.Um):
Console.WriteLine(e);
break;
default:
break;
}
}
}
Saída
Zero
Exemplo 6
using System;
public class Program
{
public static void Main()
{
int a = 10;
switch(a)
{
case int val when (val >= 5):
Console.WriteLine(a);
break;
default:
break;
}
}
}
Saída
10
Switch e case com and ou or
Os cases do comando switch podem conter expressões contendo os operadores lógicos
and, or e not criando assim um intervalo de dados específico. Abaixo
um exemplo que ilustra o que foi explicado:
Exemplo 7: and com intervalo
using System;
class HelloWorld
{
static void Main()
{
int valor_teste = 1;
switch(valor_teste)
{
case > 0 and < 3 : Console.WriteLine("> 0 and < 3 "); break;
case < 0 and > -3: Console.WriteLine("<< 0 and > -3"); break;
}
switch(valor_teste)
{
case 0 or 1 : Console.WriteLine("0 or 1"); break;
case 2 or 3: Console.WriteLine("2 or 3"); break;
}
}
}
Saída
< 0 and > -3
Exemplo 8: when com intervalo
using System;
public class Program
{
public static void Main()
{
int a = 10;
switch(a)
{
case int val when (val >= 5):
Console.WriteLine(a);
break;
default:
break;
}
}
}
Saída
10
Na expressão contendo and ou or também é possível utilizar os tipos string, char e enums
como os valores para teste:
Exemplo 9: intervalo com char
using System;
public enum Test{A,B,C,D}
class HelloWorld
{
static void Main()
{
char valor_teste = 'b';
switch(valor_teste)
{
case > 'a' and < 'c': Console.WriteLine("> a"); break;
case > 'd': Console.WriteLine("> d"); break;
}
string str = "c#";
switch(str)
{
case "c#" or "c++": Console.WriteLine("c# or c++"); break;
case "java"or "kotlin": Console.WriteLine("java or kotlin"); break;
}
Test tst = Test.A;
switch(tst)
{
case Test.A or Test.B: Console.WriteLine("Test.A or Test.B"); break;
case Test.C or Test.D: Console.WriteLine("Test.C or Test.D"); break;
}
}
}
Saída
> a
c# or c++
Test.A or Test.B
A partir de C# 8, uma nova sintaxe para o comando switch foi adicionada:
Switch Expression. A sintaxe é semelhante ao padrão match disponível
em outras linguagens.
Sintaxe
tipo_dado nome_variavel = expressao_teste switch {
<valor_testado1> => expressao1,
<valor_testado2> => expressao2,
<valor_testadoN> => expressaoN,
_ => expressao_default
};
Nessa nova sintaxe, podemos atribuir um valor de retorno do comando sem a necessidade de
atribuição interna em cada caso, uso de break ou retorno de para método.
Exemplo 10
using System;
class HelloWorld
{
static void Main()
{
int valor_teste = 1;
int ret = valor_teste switch
{
1 => valor_teste*1,
2 => valor_teste*2,
3 => valor_teste*3,
_ => -1
};
Console.WriteLine($"{ret}");
}
}
Saída
1
Com Switch Expression, também é possível utilizar os tipos string, char e enums como
os valores para teste. Além disso, as expressões utilizando (>, <, <=, >=) e (and, or e not)
podem ser utilizadas também:
Exemplo 11
using System;
public enum Test{ A, B, C, D}
class HelloWorld
{
static void Main()
{
char valor_teste = 'b';
var res1 = valor_teste switch
{
> 'a' and < 'c' => "> \'a\' and < \'c\'",
> 'd' => "> d",
_ => String.Empty
};
Console.WriteLine($"{res1}");
string str = "c#";
var res2 = str switch
{
"c#" or "c++" => "\"c#\" or \"c++\"",
"java"or "kotlin" => "java or kotlin",
_ => String.Empty
};
Console.WriteLine($"{res2}");
Test tst = Test.A;
var res3 = tst switch
{
Test.A or Test.B => "Test.A or Test.B",
Test.C or Test.D =>"Test.C or Test.D",
_ => String.Empty
};
Console.WriteLine($"{res3}");
}
}
Saída
> 'a' and < 'c'
"c#" or "c++"
Test.A or Test.B